
package modelos;

/**
 * Modela los datos de la grafica de la funcion
 * @author Rafael Carrillo 90465
 */
public class DatosFuncion {
    private String titulo;
    private String tituloX;
    private String tituloY;
    private double[][]puntos;
    private int numPuntos;
    private double minX;
    private double maxX;
    private double minY;
    private double maxY;

    /**
     * Crea el modelo de la grafica de Funcion y calcula los rangos de valores
     * @param titulo Titulo de la Grafica
     * @param tituloX Rotulo del eje X
     * @param tituloY Rotulo del eje Y
     * @param puntos  Arreglo con los puntos x,y a graficar
     */
    public DatosFuncion(String titulo, String tituloX, String tituloY,
            double[][] puntos) {
        this.titulo = titulo;
        this.tituloX = tituloX;
        this.tituloY = tituloY;
        this.puntos = puntos;
        calculaRangos();
    }

    
    /**
     * Devuelve el valor Maximo del eje X
     * @return valor maximo X
     */
    public double getMaxX() {
        return maxX;
    }
    
    /**
     * Devuelve el valor Maximo del eje Y
     * @return valor maximo Y
     */
    public double getMaxY() {
        return maxY;
    }
    
    /**
     * Devuelve el valor minimo del eje X
     * @return valor minimo X
     */
    public double getMinX() {
        return minX;
    }

    /**
     * Devuelve el valor minimo del eje Y
     * @return valor minimo Y
     */
    public double getMinY() {
        return minY;
    }

    /**
     * Devuelve el numero de puntos (tamaño del arreglo de puntos) de la grafica
     * @return Numero de Puntos x,y
     */
    public int getNumPuntos() {
        return numPuntos;
    }
    /**
     * Devuelve los puntos x,y de la grafica en un arreglo
     * @return Puntos x,y en la grafica
     */
    public double[][] getPuntos() {
        return puntos;
    }
    
    /**
     * Establece los puntos del arreglo de puntos x,y
     * @param puntos 
     */
    public void setPuntos(double[][] puntos) {
        this.puntos = puntos;
        calculaRangos();
    }
    /**
     * Devuelve el titulo de la grafica
     * @return  Titulo de la grafica
     */
    public String getTitulo() {
        return titulo;
    }
    /**
     * Establece el titulo de la Grafica
     * @param titulo Titulo nuevo
     */
    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }
    
    /**
     * Devuelve el titulo del eje X de la grafica
     * @return Titulo del eje X
     */
    public String getTituloX() {
        return tituloX;
    }
    
    /**
     * Establece el titulo del eje X de la grafica
     * @param tituloX Titulo del Eje X
     */
    public void setTituloX(String tituloX) {
        this.tituloX = tituloX;
    }
    
    /**
     * Devuelve el titulo del eje Y de la grafica
     * @return Titulo del eje Y
     */
    public String getTituloY() {
        return tituloY;
    }
    
    /**
     * Estblece el titulo del Eje Y de la grafica
     * @param tituloY Titulo del eje Y
     */
    public void setTituloY(String tituloY) {
        this.tituloY = tituloY;
    }
    
    /**
     * Calcula los puntos maximos y minimos de x,y ; establece el numero de puntos
     */
    private void calculaRangos(){
        numPuntos=puntos.length;
        double[]maxMinX=getMaxMin(puntos,1);
        double[]maxMinY=getMaxMin(puntos,2);
        maxX=maxMinX[0];
        minX=maxMinX[1];
        maxY=maxMinY[0];
        minY=maxMinY[1];
    }
    
    /**
     * Obtiene el valor maximo y minimo del arreglo bidimensional dado el argumento
     * option indica de que columna se obtendran los datos
     * @param puntos Arreglo bidimensional
     * @param option 1= Obtener valores Maximos y Minimos de X, 2= Obtener Valores Maximos 
     * y Minimos de Y
     * @return arreglo con 2 valores 0=Max 1=Minf
     */
    private double[] getMaxMin(double[][] puntos,int option){
        double[] maxMin=new double[2];
        switch(option){
            case 1: //1 get MaxX y MinX
                for(int i=0;i<numPuntos;i++){ // MaxX
                    double valor=puntos[i][0];
                    if (valor>maxMin[0])
                        maxMin[0]=valor;
                }
                maxMin[1]=maxMin[0];
                for(int i=0;i<numPuntos;i++){//MinX
                    double valor=puntos[i][1];
                    if (valor<maxMin[1])
                        maxMin[1]=valor;
                }
                return maxMin;
                
            case 2: //2 get MaxY y MinY
                for(int i=0;i<puntos.length;i++){
                if (puntos[i][1]>maxMin[0])
                    maxMin[0]=puntos[i][1];
                }
                maxMin[1]=maxMin[0];
                for(int i=0;i<puntos.length;i++){
                if (puntos[i][1]<maxMin[1])
                    maxMin[1]=puntos[i][1];
                }
                return maxMin;
        }
        return null;
    }
}
